البرمجة

دليل استخدام النماذج في جانغو

تطبيق عملي لتعلم جانغو – الجزء الثاني: استخدام النماذج (Models)

تعتبر النماذج (Models) في Django واحدة من أهم المفاهيم الأساسية التي يجب على كل مطور فهمها بشكل عميق عند العمل مع هذا الإطار البرمجي. في الجزء الأول من هذا المقال، تم استعراض مفهوم Django بشكل عام وبعض خصائصه الأساسية، وفي هذا الجزء سنتناول بشكل موسع كيفية التعامل مع النماذج في Django، وكيفية استخدامها لإنشاء قواعد بيانات ديناميكية ومرنة في تطبيقات الويب.

1. ما هي النماذج في Django؟

النماذج (Models) في Django هي عبارة عن فئة (class) تمثل بنية بيانات محددة في قاعدة البيانات. كل نموذج في Django يعكس جدولًا في قاعدة البيانات، وكل خاصية داخل النموذج تمثل عمودًا في ذلك الجدول. كما أن النماذج في Django تُستخدم لتحديد كيفية تخزين البيانات في قاعدة البيانات وكذلك كيفية التعامل معها من خلال تطبيق Django. من خلال النماذج، يتمكن المطورون من إجراء عمليات CRUD (إنشاء، قراءة، تحديث، وحذف) على البيانات بشكل سهل وفعال دون الحاجة للكتابة يدويًا لاستعلامات SQL.

2. بنية النموذج في Django

لنفترض أن لدينا تطبيقًا لإدارة الكتب. يمكننا إنشاء نموذج يمثل الكتاب في قاعدة البيانات. النموذج سيكون فئة (class) في ملف models.py داخل تطبيق Django.

python
from django.db import models class Book(models.Model): title = models.CharField(max_length=100) author = models.CharField(max_length=100) published_date = models.DateField() isbn_number = models.CharField(max_length=13) genre = models.CharField(max_length=50) def __str__(self): return self.title

شرح الكود:

  • class Book(models.Model): هذه هي الفئة التي تمثل النموذج “Book”. الميراث من models.Model يتيح للنموذج التعامل مع قاعدة البيانات.

  • title, author, published_date, isbn_number, genre: هذه هي الحقول التي تمثل الأعمدة في جدول قاعدة البيانات الخاص بالكتب. تتنوع أنواع الحقول التي تقدمها Django مثل CharField للنصوص القصيرة وDateField للتواريخ.

  • def str(self): هذه الدالة تقوم بتحديد كيف يجب أن يظهر الكائن في واجهات الإدارة أو عند طباعة الكائن.

3. أنواع الحقول في النماذج

تحتوي Django على مجموعة من أنواع الحقول التي تسمح بتخزين أنواع مختلفة من البيانات في قاعدة البيانات. وفيما يلي بعض الأنواع الأكثر شيوعًا:

  • CharField: لتخزين نصوص قصيرة مثل العناوين أو الأسماء.

  • TextField: لتخزين نصوص طويلة مثل الوصف.

  • IntegerField: لتخزين الأعداد الصحيحة.

  • DecimalField: لتخزين الأعداد العشرية.

  • FloatField: لتخزين الأعداد العشرية ذات الفاصلة العائمة.

  • BooleanField: لتخزين القيم المنطقية (صح أو خطأ).

  • DateField & DateTimeField: لتخزين التواريخ والأوقات.

  • ForeignKey: لتخزين العلاقة بين الجداول، بحيث يكون هذا الحقل مفتاحًا أجنبيًا يشير إلى نموذج آخر.

مثال آخر باستخدام أنواع مختلفة من الحقول:

python
class Author(models.Model): name = models.CharField(max_length=100) birth_date = models.DateField() nationality = models.CharField(max_length=50) class Book(models.Model): title = models.CharField(max_length=200) author = models.ForeignKey(Author, on_delete=models.CASCADE) published_date = models.DateField() isbn_number = models.CharField(max_length=13) genre = models.CharField(max_length=50)

في هذا المثال، تم إضافة نموذج Author الذي يحتوي على حقول للاسم، تاريخ الميلاد، والجنسية. كما أضفنا علاقة من نوع ForeignKey في نموذج Book تشير إلى المؤلف الذي كتب الكتاب.

4. التعامل مع قواعد البيانات باستخدام النماذج

عند إنشاء النماذج وتحديد الحقول، تحتاج إلى تفعيل التغييرات في قاعدة البيانات. للقيام بذلك، يجب عليك أولاً إنشاء الهجرة (migration) الخاصة بتغييرات النموذج، ثم تطبيق هذه الهجرة على قاعدة البيانات.

إنشاء الهجرات:

لتوليد ملف الهجرة، يمكنك استخدام الأمر التالي في سطر الأوامر:

bash
python manage.py makemigrations

سيقوم Django بإنشاء ملف هجرة يحتوي على تعليمات لتعديل قاعدة البيانات بناءً على التغييرات التي أُجريت على النماذج.

تطبيق الهجرات:

لتطبيق الهجرة على قاعدة البيانات، يمكنك استخدام الأمر التالي:

bash
python manage.py migrate

سيقوم هذا الأمر بتنفيذ التغييرات المقررة في قاعدة البيانات، مثل إضافة الجداول أو تعديل الحقول.

5. إدارة البيانات باستخدام Django Shell

Django يوفر واجهة تفاعلية (shell) يمكنك من خلالها التعامل مع النماذج مباشرة. للدخول إلى هذه الواجهة، استخدم الأمر التالي:

bash
python manage.py shell

بمجرد أن تكون في الـ shell، يمكنك إنشاء سجلات جديدة، تحديث السجلات الحالية، أو حتى حذفها.

إنشاء سجل جديد:

python
from myapp.models import Book, Author author = Author.objects.create(name="J.K. Rowling", birth_date="1965-07-31", nationality="British") book = Book.objects.create(title="Harry Potter and the Philosopher's Stone", author=author, published_date="1997-06-26", isbn_number="9780747532743", genre="Fantasy")

قراءة السجلات:

python
books = Book.objects.all() # جلب جميع الكتب book = Book.objects.get(id=1) # جلب الكتاب الذي يحتوي على id = 1

تحديث السجلات:

python
book = Book.objects.get(id=1) book.title = "Harry Potter and the Sorcerer's Stone" book.save() # حفظ التغييرات

حذف السجلات:

python
book = Book.objects.get(id=1) book.delete() # حذف السجل

6. الفلاتر (Filters) والبحث في البيانات

يمكنك استخدام فلاتر لتحديد البيانات التي تريد جلبها من قاعدة البيانات. توفر Django العديد من الأدوات المدمجة التي تتيح لك تصفية السجلات وفقًا للعديد من الشروط.

مثال على استخدام الفلاتر:

python
# جلب جميع الكتب التي تم نشرها بعد عام 2000 books = Book.objects.filter(published_date__year__gte=2000) # جلب الكتاب الذي يحتوي على نوع "Fantasy" books = Book.objects.filter(genre="Fantasy")

7. العلاقات بين النماذج

تُعتبر العلاقات بين النماذج من الجوانب الأساسية في Django. هناك ثلاث أنواع رئيسية للعلاقات بين النماذج:

  • علاقة One-to-One (OneToOneField): يتم استخدامها عندما يكون هناك ارتباط بين نموذجين بحيث كل سجل في النموذج الأول يرتبط بسجل واحد فقط في النموذج الثاني.

  • علاقة One-to-Many (ForeignKey): هذا هو النوع الأكثر شيوعًا في Django، حيث يرتبط سجل واحد من نموذج ما بعدد من السجلات في نموذج آخر. تمثل العلاقة بين المؤلف والكتاب مثالاً جيدًا على هذه العلاقة.

  • علاقة Many-to-Many (ManyToManyField): يُستخدم هذا النوع عندما يكون هناك ارتباط بين عدة سجلات في نموذج واحد مع عدة سجلات في نموذج آخر.

مثال على علاقة Many-to-Many:

python
class Book(models.Model): title = models.CharField(max_length=200) authors = models.ManyToManyField(Author) # الآن يمكن للكتاب أن يحتوي على عدة مؤلفين، ويمكن للمؤلفين كتابة عدة كتب

8. إضافة النماذج إلى واجهة الإدارة

تتيح Django للمطورين إضافة النماذج إلى واجهة الإدارة بسهولة من خلال ملف admin.py. يمكن إضافة النماذج التي تم إنشاؤها للتو إلى واجهة الإدارة لتسهيل إدارة البيانات.

إضافة نموذج إلى واجهة الإدارة:

python
from django.contrib import admin from .models import Book, Author admin.site.register(Book) admin.site.register(Author)

بعد ذلك، عند تسجيل الدخول إلى واجهة الإدارة (عادة في localhost:8000/admin)، ستتمكن من إدارة الكتب والمؤلفين بسهولة.

9. استراتيجيات متقدمة في النماذج

إلى جانب العمليات الأساسية التي تمت مناقشتها، تقدم Django ميزات متقدمة لتحسين كيفية التعامل مع النماذج. يشمل ذلك استخدام الإشعارات (signals) للتحكم في العمليات التي تحدث عند إضافة أو تعديل أو حذف السجلات، واستخدام الواجهات البينية (abstract models) لإنشاء هياكل مرنة وإعادة استخدامها عبر عدة نماذج.

مثال على استخدام signals:

python
from django.db.models.signals import pre_save from django.dispatch import receiver @receiver(pre_save, sender=Book) def check_isbn(sender, instance, **kwargs): if len(instance.isbn_number) != 13: raise ValueError("ISBN number must be 13 characters long")

في هذا المثال، قمنا بإضافة إشارة للتحقق من أن رقم ISBN يحتوي على 13 حرفًا قبل أن يتم حفظ الكتاب.

10. الخاتمة

النماذج في Django هي جزء أساسي من بناء التطبيقات الحديثة على هذا الإطار البرمجي، فهي توفر طريقة مرنة وقوية للعمل مع قواعد البيانات بدون الحاجة لكتابة استعلامات SQL يدويًا. من خلال النماذج، يمكنك تنظيم البيانات بشكل منطقي وسهل، إضافة العلاقات بين الجداول، وإجراء عمليات معقدة بكل بساطة.

في هذا الجزء، قمنا بتغطية العديد من الجوانب المهمة للنماذج في Django، من إنشاء النماذج إلى إدارة العلاقات بين النماذج، والتفاعل مع البيانات من خلال واجهة الإدارة. يعتبر هذا المقال نقطة انطلاق جيدة للمطورين الذين يرغبون في بناء تطبيقات ويب ديناميكية باستخدام Django.